package top.lshaci.learning.singleton;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

/**
 * StaticInnerClass
 *
 * <pre>
 *     静态内部类
 *     1) 这种方式采用了类装载的机制来保证初始化实例时只有一个线程
 *     2) 静态内部类方式在 StaticInnerClass 类被装载时并不会立即实例化，而是在需要实例化时，
 *        调用 instance方法，才会装载 InnerClass 类，从而完成 singleton 的实例化
 *     3) 类的静态属性只会在第一次加载类的时候初始化，所以在这里，JVM 帮助我们保证了线程的安全性，
 *        在类进行初始化时，别的线程是无法进入的
 *     4) 避免了线程不安全，利用静态内部类特点实现延迟加载，效率高
 * </pre>
 *
 * @author lshaci
 * @since 1.0.0
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class StaticInnerClass {

    public static StaticInnerClass instance() {
        return InnerClass.singleton;
    }

    private static class InnerClass {
        private static final StaticInnerClass singleton = new StaticInnerClass();
    }
}
